#define STACK_TOP   0x20000800
#define NVIC_CCR    ((volatile unsigned long *)(0xE000ED14))
// 声明函数原型
void myputs(const char *string1);
void myputc(char mychar);
int main(void);
void nmi_handler(void);
void hardfault_handler(void);
// 定义向量表
__attribute__ (( section("vectors") )) void (* const VectorArray[])(void) =   /* __attribute(()) 指定特殊属性，这里指出函数指针数组是放到vectors段中，vectors段由simple.ld给出 */
{
    STACK_TOP,
    main,
    nmi_handler,
    hardfault_handler
};

// 主程序入口点
int main(void)
{
    const char **helloword="Hello world\n";
    *NVIC_CCR = *NVIC_CCR | 0x200;  /* 设置NVIC的STKALIGN */
    myputs(*helloword);
    while(1);
    return (0);
}

// 函数
void myputs(const char *string1)
{
    char mychar;
    int j;
    j=0;
    do
    {
        mychar = string1[j];
        if(mychar != 0)
        {
            myputc(mychar);
            j++;
        }
    } while (mychar != 0);
    return;
}

void myputc(char mychar)
{
    #define UART0_DATA ((volatile unsigned long *)(0x4000C000))
    #define UART0_FLAG ((volatile unsigned long *)(0x4000C018))
    // Wait until busy flag is clear
    while((*UART0_FLAG & 0x20) != 0);
    // output character to UART
    *UART0_DATA = mychar;
    return;
}

// 空的服务函数
void nmi_handler(void)
{
    return;
}

void hardfault_handler(void)
{
    return;
}
